﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <stddef.h>
// C/C++ 学习网站：https://legacy.cplusplus.com 注意旧版本（搜索）和新版本

// 联合（union）是一种数据类型，它可以存储不同的数据类型，一般访问其中一个就不访问其他成员。

#include "common.h"

union Un {
    char a;
    int b;
    char c;
} un;

struct St { 
    char a;
    int b;
    char c;
} st;

typedef union Data {
    char da[5];
    int db;
    char dc;
} dt;

int check_system()
{ // 检测编译器的大小端储存方式
    //曾经的写法
    /*int a = 1;
    return *(char*)&a; // 若为小端，则返回 1，若为大端，则返回 0 */

    // 新写法
    typedef union check {
        int a; // 4 字节
        char b; // 1 字节
    } c; // 共用内存空间
    c c1 = { 0 }; // 初始化 4 字节的内存空间，赋值为 0
    c1.a = 1;
    return c1.b;
}

void union_test()
{
    printf("sizeof(Data) = %zd\n", sizeof(union Un)); // 4
    printf("sizeof(St) = %zd\n", sizeof(struct St)); // 12

    un.b = 15;
    printf("un.b = %d\n", un.b);

    un.a = 'A';
    printf("un.a = %c\n", un.a);
    printf("使用 un.a 后 un.b = %d\n", un.b);

    // 检测编译器的大小端储存方式
    printf("check_system返回值为：%d\n", check_system());

    // 联合体在内存中的对齐
    printf("sizeof(dt) = %zd\n", sizeof(dt)); // 8，因为 db 对齐数是 4，应该为 4 的倍数
    printf("offsetof(dt, da) = %zd\n", offsetof(dt, da));
    printf("offsetof(dt, db) = %zd\n", offsetof(dt, db));
    printf("offsetof(dt, dc) = %zd\n", offsetof(dt, dc));
}
